#ifndef STATUSCODE_H
#define STATUSCODE_H

#include <string>
#include <iostream>

/**
 * Cette classe permet d'avoir des valeurs de retour plus évoluées
 * pour une fonction qu'un simple bool.
 *
 * On peut tester un StatusCode exactement comme un bool, mais il
 * contient une valeur de retour (Valeur) et un code qui peut être
 * utilisé pour le traitement d'erreur. Une string (Message) peut
 * egalement être joint.
 */
class StatusCode
{
 public:
  StatusCode(const bool& etat = true, const int& val = 0, const int& code = 0,
	     const std::string& message = "");
  StatusCode(const StatusCode& sc);
  virtual ~StatusCode();
  operator bool() const;
  operator int() const;
  /**
   * Permet de réaliser un affichage simple d'un StatusCode.
   *
   * @param os flot de sortie.
   * @param sc StatusCode à afficher.
   * @return le flot de sortie modifié.
   */
  friend std::ostream& operator<<(std::ostream& os, const StatusCode& sc);
  const bool& etat() const;
  const int& valeur() const;
  const int& code() const;
  const std::string& message() const;
 protected:
  /**
   * Reflète l'état Succès (\e true) ou Echec (\e false).
   */
  bool Etat;
  int  Valeur, /**< Valeur de retour supplémentaire. */
    Code; /**< Code d'erreur lors d'un échec. */
  /**
   * Permet de stocker un message lors de l'émission d'une erreur
   * notament.
   */
  std::string Message;
};

#endif // STATUSCODE_H
